/* 						-*- coding: utf-8 -*-
 * Une version de intern
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "intern.h"
#include "environ.h"
#include "history.h"

#define MAXBUFFER 256

/* Commande cd ou chdir */
void cmd_cd(int argc, char **argv) {
	if(argc == 1){ //si un seul argument on se place dans le homedir
		chdir(get_environ("HOME"));
	} else {
		if(chdir(argv[1]) == -1){ //sinon on tente de se placer dans le répertoire définit par le premier argument 
			fprintf(stderr, "cd: Not a directory \n");
		}
	}
	set_environ("PWD", get_current_dir_name()); //on actualise le PWD
}

/* Commande echo */
void cmd_echo(int argc, char **argv) {
	int i;
	for(i=1; i<argc; i++){ //on affiche une à une toutes les variables
		printf("%s ", argv[i]);
	}
	printf("\n");
}

/* Commande exit, quitte le shell */
void cmd_exit(int argc, char **argv) {
	exit((argc>=2)?atoi(argv[1]):0);
}

/* Commande pwd, affiche le chemin du répertoire courrant */
void cmd_pwd(int argc, char **argv) {
	printf("%s \n", get_environ("PWD"));
}

/* Commande set, permet d'allouer ou d'afficher les variables d'environnement */
void cmd_set(int argc, char*arg[]){
    if(argc == 1) {
        print_environ(stdout);
    } else if(argc == 3){
        set_environ(arg[1], arg[2]);
    } else {
        fprintf(stderr, "set: invalid amount of parameters");
        return;
    }
}

/* Commande read, lit le contenu d'une variable pour l'ajouter aux var. d'env. */
void cmd_read(int argc, char*arg[]){
    if(argc != 2) {
        fprintf(stderr, "read: invalid amount of parameters");
        return;
    }
    char read[MAXBUFFER];
    fgets(read, MAXBUFFER, stdin);
	read[strlen(read)-1] = '\0';
    set_environ(arg[1], read);
}

/* Commande history, affiche l'historique */
void cmd_history(int argc, char **argv) {
	if(argc == 1){
		print_history(stdout);
	} else if(argc == 2){ //si on a un 2e argument
		if(atoi(argv[1]) == 0){ //on teste que c'est un entier convertible
			fprintf(stderr, "history: invalid parameter \n");
		}
		init_history(atoi(argv[1])+1); //on initialise l'historique avec la taille entrée
	} else {
			fprintf(stderr, "history: invalid amount of parameters \n");
	}
}

/* Exécute la fonction correspondante à la commande passée en paramètre */
internal_cmd find_internal(char *name) {
	if(strcmp(name, "cd") == 0 || strcmp(name, "chdir") == 0) return cmd_cd;
	if(strcmp(name, "echo") == 0) return cmd_echo;
	if(strcmp(name, "exit") == 0) return cmd_exit;
	if(strcmp(name, "pwd") == 0) return cmd_pwd;
	if(strcmp(name, "read") == 0) return cmd_read;
	if(strcmp(name, "set") == 0) return cmd_set;
	if(strcmp(name, "history") == 0) return cmd_history;
	return NULL;
}
